#include <stdbool.h>
#define QUEUESIZE 100

typedef struct queue {
    void* data[QUEUESIZE];
    int front;  // 指向队头元素
    int rear;   // 指向队尾元素的下一个位置
} SqQueue;

void InitQueue(SqQueue* q) {
    q->front = 0;
    q->rear = 0;
}

// 将数据元素e入队
// 成功，返回TRUE
// 失败，返回FALSE
bool EnQueue(SqQueue* q, void* e) {
    if ((q->rear + 1) % QUEUESIZE == q->front) {
        return false;  // 队列满
    }
    q->data[q->rear] = e;                 // 元素e入队
    q->rear = (q->rear + 1) % QUEUESIZE;  // 队尾指针循环加1
    return true;
}

// 出队，用e返回队头元素
// 成功，返回TRUE
// 失败，返回FALSE
bool DeQueue(SqQueue* q, void** e) {
    if (q->front == q->rear) {
        return false;  // 队列为空
    }
    *e = q->data[q->front];                 // 队头元素出队
    q->front = (q->front + 1) % QUEUESIZE;  // 队头指针循环加1
    return true;
}

// 判断队列是否为空
// 空，返回TRUE
// 非空，返回FALSE
bool QueueEmpty(SqQueue* q) {
    if (q->front == q->rear) {
        return true;
    } else {
        return false;
    }
}